GFX Decompression routine
-------------------------

org $02863D

$06 = Compressed data index
$08 = Compressed data length (16 bits)
$0C = Decompressed data index
$1C = 

start: 
	REP #$20
	LDA #$0400
	STA $1C		; Buffer's size
	STZ $0C		; Decompressed buffer index ($7E:3000 + $0C)
	STZ $1A
	BRA setup

$02/864A C2 20       REP #$20                A:0400 X:0001 Y:0000 P:envmxdIzC
$02/864C A5 1C       LDA $1C    [$00:1A1C]   A:0400 X:0001 Y:0000 P:envmxdIzC
$02/864E 29 FF 03    AND #$03FF              A:0400 X:0001 Y:0000 P:envmxdIzC
$02/8651 85 0C       STA $0C    [$00:1A0C]   A:0400 X:0001 Y:0000 P:envmxdIzC
$02/8653 85 1A       STA $1A    [$00:1A1A]   A:0400 X:0001 Y:0000 P:envmxdIzC
$02/8655 18          CLC                     A:0400 X:0001 Y:0000 P:envmxdIzC
$02/8656 69 80 00    ADC #$0080              A:0400 X:0001 Y:0000 P:envmxdIzC
$02/8659 85 1C       STA $1C    [$00:1A1C]   A:0400 X:0001 Y:0000 P:envmxdIzC

$02/866E BF 00 00 01 LDA $010000,x[$01:B5B0] A:0000 X:B5B0 Y:0040 P:eNvmxdIzc <--------*************
$02/86CF B7 00       LDA [$00],y[$1C:8002]   A:0000 X:B5FC Y:0002 P:eNvMxdIzc
$02/868A B7 00       LDA [$00],y[$1D:8000]   A:801D X:B60A Y:0000 P:envmxdIZC <- OMFG THIS $07:8DC9
setup:
	SEP #$20
	PHB
	LDA #$7E
	PHA
	PLB  		; Set DBR to #$7E
	REP #$10
	REP #$20
	LDA $10
	BNE $3C [$86A6]	; No idea.
	INC $10
	LDX $18
	LDA $010000,x
	STA $00		; lower 16 bits of the GFX address
	INX
	INX
	SEP #$20
	LDA $010000,x
	STA $02		; higher 8 bits of the GFX address
	INX
	STX $18
	LDY #$0000
	STZ $14
	STY $0C
	REP #$20
	LDA [$00],y	
	STA $08		; Save the first byte of the run and proceed
	INY		; to clean up $7E:3000 - $7E:3FFF
	INY
	STY $06		; $06 = GFX buffer position
	LDY #$03FE
	LDA #$0000
-	STA [$03],y	; Remember setting up the DBR before?
	DEY
	DEY
	BPL -
	BRA +		; $02869E
-	STZ $10
	PLB		; Restore the DBR
	REP #$20	; Set A to 16 bits
	RTL		; Finally...
	
+	SEP #$20
	LDA $14
	BEQ decomp
$02/86AC C9 01       CMP #$01                A:0000 X:0000 Y:0000 P:EnvMxdIzc
$02/86AE D0 03       BNE $03    [$86B3]      A:0000 X:0000 Y:0000 P:EnvMxdIzc
$02/86B0 4C 9C 87    JMP $879C  [$00:879C]   A:0000 X:0000 Y:0000 P:EnvMxdIzc
$02/86B3 C9 02       CMP #$02                A:0000 X:0000 Y:0000 P:EnvMxdIzc
$02/86B5 D0 03       BNE $03    [$86BA]      A:0000 X:0000 Y:0000 P:EnvMxdIzc
$02/86B7 4C 5C 87    JMP $875C  [$00:875C]   A:0000 X:0000 Y:0000 P:EnvMxdIzc
$02/86BA C9 03       CMP #$03                A:0000 X:0000 Y:0000 P:EnvMxdIzc
$02/86BC D0 03       BNE $03    [$86C1]      A:0000 X:0000 Y:0000 P:EnvMxdIzc
$02/86BE 4C 3B 87    JMP $873B  [$00:873B]   A:0000 X:0000 Y:0000 P:EnvMxdIzc
$02/86C1 C9 04       CMP #$04                A:0000 X:0000 Y:0000 P:EnvMxdIzc
$02/86C3 F0 2B       BEQ $2B    [$86F0]      A:0000 X:0000 Y:0000 P:EnvMxdIzc
$02/86C5 C9 05       CMP #$05                A:0000 X:0000 Y:0000 P:EnvMxdIzc
$02/86C7 F0 3F       BEQ $3F    [$8708]      A:0000 X:0000 Y:0000 P:EnvMxdIzc
decomp:
	LDY $06
	CPY $08		; $08 = Current GFX buffer byte being read
	BCS -		; if Y >= Length of the run, bail out.
	LDA [$00],y
	INY
	STY $06
	CMP #$80
	BCS +		; Branch if A >= #$80
	JMP $8777
+	CMP #$A0
	BCC +		; Branch if A < #$A0
	CMP #$C0
	BCC +		; Branch if A < #$C0
	CMP #$E0
	BCC $39    [$8720]; Branch if A < #$E0
	BCS $41    [$872A]; Branch if A >= #$E0
+	AND #$1F                A:0000 X:0000 Y:0000 P:EnvMxdIzc
$02/86EB 18          CLC                     A:0000 X:0000 Y:0000 P:EnvMxdIzc
$02/86EC 69 02       ADC #$02                A:0000 X:0000 Y:0000 P:EnvMxdIzc
$02/86EE 85 0E       STA $0E    [$00:000E]   A:0000 X:0000 Y:0000 P:EnvMxdIzc
$02/86F0 C6 0E       DEC $0E    [$00:000E]   A:0000 X:0000 Y:0000 P:EnvMxdIzc
$02/86F2 10 03       BPL $03    [$86F7]      A:0000 X:0000 Y:0000 P:EnvMxdIzc
$02/86F4 4C C3 87    JMP $87C3  [$00:87C3]   A:0000 X:0000 Y:0000 P:EnvMxdIzc
$02/86F7 A9 05       LDA #$05                A:0000 X:0000 Y:0000 P:EnvMxdIzc
$02/86F9 85 14       STA $14    [$00:0014]   A:0000 X:0000 Y:0000 P:EnvMxdIzc
$02/86FB A9 00       LDA #$00                A:0000 X:0000 Y:0000 P:EnvMxdIzc
$02/86FD A4 0C       LDY $0C    [$00:000C]   A:0000 X:0000 Y:0000 P:EnvMxdIzc
$02/86FF 91 03       STA ($03),y[$00:5555]   A:0000 X:0000 Y:0000 P:EnvMxdIzc
+	AND #$1F
	STA $0E
	LDA #$02
	STA $14
	LDX $06
-	DEC $0E
	BMI read_next
	TXY
	LDA [$00],y
	INY
	TYX
	LDY $0C
	STA ($03),y
	INY
	STY $0C
	CPY $1C
	BCC -
	STX $06
	BRL $FF2B  [$86A2]
$02/8777 85 0B       STA $0B    [$00:1F0B]   A:0081 X:B600 Y:0003 P:eNvMxdIzc
$02/8779 4A          LSR A                   A:0081 X:B600 Y:0003 P:eNvMxdIzc
$02/877A 4A          LSR A                   A:0081 X:B600 Y:0003 P:eNvMxdIzc
$02/877B 18          CLC                     A:0081 X:B600 Y:0003 P:eNvMxdIzc
$02/877C 69 02       ADC #$02                A:0081 X:B600 Y:0003 P:eNvMxdIzc
$02/877E 85 0E       STA $0E    [$00:1F0E]   A:0081 X:B600 Y:0003 P:eNvMxdIzc
$02/8780 A4 06       LDY $06    [$00:1F06]   A:0081 X:B600 Y:0003 P:eNvMxdIzc
$02/8782 B7 00       LDA [$00],y[$1C:8003]   A:0081 X:B600 Y:0003 P:eNvMxdIzc
$02/8784 C8          INY                     A:0081 X:B600 Y:0003 P:eNvMxdIzc
$02/8785 84 06       STY $06    [$00:1F06]   A:0081 X:B600 Y:0003 P:eNvMxdIzc
$02/8787 85 0A       STA $0A    [$00:1F0A]   A:0081 X:B600 Y:0003 P:eNvMxdIzc
$02/8789 C2 20       REP #$20                A:0081 X:B600 Y:0003 P:eNvMxdIzc
$02/878B A5 0A       LDA $0A    [$00:1F0A]   A:0081 X:B600 Y:0003 P:eNvmxdIzc
$02/878D 38          SEC                     A:0081 X:B600 Y:0003 P:eNvmxdIzc
$02/878E E9 DF 03    SBC #$03DF              A:0081 X:B600 Y:0003 P:eNvmxdIzc
$02/8791 29 FF 03    AND #$03FF              A:0081 X:B600 Y:0003 P:eNvmxdIzc
$02/8794 85 0A       STA $0A    [$00:1F0A]   A:0081 X:B600 Y:0003 P:eNvmxdIzc
$02/8796 E2 20       SEP #$20                A:0081 X:B600 Y:0003 P:eNvmxdIzc
$02/8798 A9 01       LDA #$01                A:0081 X:B600 Y:0003 P:eNvMxdIzc
$02/879A 85 14       STA $14    [$00:1F14]   A:0081 X:B600 Y:0003 P:eNvMxdIzc
$02/879C A6 0A       LDX $0A    [$00:1F0A]   A:0081 X:B600 Y:0003 P:eNvMxdIzc
$02/879E C6 0E       DEC $0E    [$00:1F0E]   A:0081 X:B600 Y:0003 P:eNvMxdIzc
$02/87A0 30 21       BMI $21    [$87C3]      A:0081 X:B600 Y:0003 P:eNvMxdIzc
$02/87A2 9B          TXY                     A:0081 X:B600 Y:0003 P:eNvMxdIzc
$02/87A3 B1 03       LDA ($03),y[$7E:3803]   A:0081 X:B600 Y:0003 P:eNvMxdIzc
$02/87A5 C8          INY                     A:0081 X:B600 Y:0003 P:eNvMxdIzc
$02/87A6 C0 00 04    CPY #$0400              A:0081 X:B600 Y:0003 P:eNvMxdIzc
$02/87A9 90 03       BCC $03    [$87AE]      A:0081 X:B600 Y:0003 P:eNvMxdIzc
$02/87AB A0 00 00    LDY #$0000              A:0081 X:B600 Y:0003 P:eNvMxdIzc
$02/87AE BB          TYX                     A:0081 X:B600 Y:0003 P:eNvMxdIzc
$02/87AF A4 0C       LDY $0C    [$00:1F0C]   A:0081 X:B600 Y:0003 P:eNvMxdIzc
$02/87B1 91 03       STA ($03),y[$7E:3803]   A:0081 X:B600 Y:0003 P:eNvMxdIzc
$02/87B3 C8          INY                     A:0081 X:B600 Y:0003 P:eNvMxdIzc
$02/87B4 84 0C       STY $0C    [$00:1F0C]   A:0081 X:B600 Y:0003 P:eNvMxdIzc
$02/87B6 C4 1C       CPY $1C    [$00:1F1C]   A:0081 X:B600 Y:0003 P:eNvMxdIzc
$02/87B8 90 E4       BCC $E4    [$879E]      A:0081 X:B600 Y:0003 P:eNvMxdIzc
$02/87BA 86 0A       STX $0A    [$00:1F0A]   A:0081 X:B600 Y:0003 P:eNvMxdIzc
$02/87BC 82 E3 FE    BRL $FEE3  [$86A2]      A:0081 X:B600 Y:0003 P:eNvMxdIzc
read_next:
	STX $06
	BRA +
	STZ $0A
+	STZ $14
	BRL decomp

